#include <iostream>
#include <thread>
#include <mutex>

int a = 0;

std::mutex mtx;

void add() {
    for (int i = 0; i < 1000000; i++) {
        mtx.lock();     // 访问前加锁，禁止别的线程访问
        a += 1;
        mtx.unlock();   // 访问后解锁，允许别的线程访问
    }
}

int main() {

    std::thread t1(add);
    std::thread t2(add);

    t1.join();
    t2.join();

    std::cout << a << std::endl;  

    // 如果不加锁，那可能两个线程同时操作a ，同时对a = a + 1
    // 其中一个线程的值会被覆盖掉，那a只能等于一次加1
    // 结果可能就是1182785，1132039，而不是2000000
}